﻿using System.Diagnostics;
using System.Runtime.Versioning;
using System.Text.Json;

using Min.ExtendKit.Common.Core.Win32.API;
using Min.ExtendKit.Common.Net.Diagnostics;

namespace Min.ExtendKit.Common.Net;

[SupportedOSPlatform("windows")]
public class NetworkHelper
{
    private static readonly HttpClient _httpClient = new();

    /// <summary>
    /// 判断当前网络是否可用。
    /// </summary>
    /// <returns>
    /// 如果当前计算机能够连接到网络（如 Wi-Fi 或以太网），返回 <c>true</c>；否则返回 <c>false</c>。
    /// </returns>
    /// <remarks>
    /// 此方法调用了 <see cref="InternetGetConnectedState"/> 来检查计算机是否已连接到网络。
    /// 它仅检测网络连接的存在，不涉及网络的质量或是否能访问外部互联网。
    /// </remarks>
    public static bool IsNetworkAvailable()
    {
        return NetApi.InternetGetConnectedState(out int connectionStatus, 0) ? true : false;
    }

    /// <summary>
    /// 获取当前网络连接类型（Ethernet, Wi-Fi, Modem）
    /// </summary>
    public static string GetNetworkType()
    {
        if (!IsNetworkAvailable()) return "None";

        NetApi.InternetGetConnectedState(out int flags, 0);
        if ((flags & 0x01) != 0) return "Modem";
        if ((flags & 0x02) != 0) return "LAN";
        if ((flags & 0x40) != 0) return "Proxy";

        return "Unknown";
    }

    /// <summary>
    /// 检测是否可以访问外部网络（如 Google DNS 8.8.8.8）
    /// </summary>
    public static bool CanAccessInternet(int timeout = 2000)
    {
        try
        {
            using System.Net.NetworkInformation.Ping ping = new();
            System.Net.NetworkInformation.PingReply reply = ping.Send("8.8.8.8", timeout);
            return reply.Status == System.Net.NetworkInformation.IPStatus.Success;
        }
        catch
        {
            return false;
        }
    }

    /// <summary>
    /// 获取本地默认网关
    /// </summary>
    public static string GetDefaultGateway()
    {
        foreach (var ni in System.Net.NetworkInformation.NetworkInterface.GetAllNetworkInterfaces())
        {
            var gw = ni.GetIPProperties()?.GatewayAddresses;
            if (gw != null)
            {
                foreach (var g in gw)
                {
                    if (g.Address.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork)
                        return g.Address.ToString();
                }
            }
        }
        return string.Empty;
    }

    public static async Task showAsync()
    {
        // 获取公网 IP
        var publicIP = await GetPublicIPAsync();
        Debug.WriteLine("公网 IP: " + publicIP);

        // 获取地理位置
        if (publicIP != null)
        {
            var geo = await GetIPGeoInfoAsync(publicIP);
            if (geo.Success)
                Debug.WriteLine($"{geo.QueryIP} -> {geo.Country} {geo.Region} {geo.City} ISP:{geo.ISP}");
        }
    }

    /// <summary>
    /// 获取当前公网 IP 地址。
    /// </summary>
    /// <returns>公网 IP 字符串，如果失败返回 null。</returns>
    public static async Task<string?> GetPublicIPAsync()
    {
        try
        {
            // 这里使用 ip-api 提供的简易接口
            return await _httpClient.GetStringAsync("https://api.ipify.org");
        }
        catch
        {
            return null;
        }
    }

    /// <summary>
    /// 根据 IP 获取地理位置信息。
    /// </summary>
    /// <param name="ip">IP 地址</param>
    /// <returns>地理信息对象，如果失败 Success=false</returns>
    public static async Task<IPGeoInfo> GetIPGeoInfoAsync(string ip)
    {
        var result = new IPGeoInfo { QueryIP = ip };
        try
        {
            var json = await _httpClient.GetStringAsync($"http://ip-api.com/json/{ip}?lang=zh-CN");
            var data = JsonSerializer.Deserialize<JsonElement>(json);

            if (data.GetProperty("status").GetString() == "success")
            {
                result.Success = true;
                result.Country = data.GetProperty("country").GetString();
                result.Region = data.GetProperty("regionName").GetString();
                result.City = data.GetProperty("city").GetString();
                result.ISP = data.GetProperty("isp").GetString();
            }
        }
        catch
        {
            // 失败时 Success 保持 false
        }

        return result;
    }


    /// <summary>
    /// 表示 IP 地址的地理位置信息。
    /// </summary>
    public class IPGeoInfo
    {
        /// <summary>
        /// 国家名称，例如 "中国"。
        /// </summary>
        public string? Country { get; set; }

        /// <summary>
        /// 省/州名称，例如 "江苏省"。
        /// </summary>
        public string? Region { get; set; }

        /// <summary>
        /// 城市名称，例如 "深圳市"。
        /// </summary>
        public string? City { get; set; }

        /// <summary>
        /// 提供商名称（ISP），例如 "China Telecom"。
        /// </summary>
        public string? ISP { get; set; }

        /// <summary>
        /// 查询的 IP 地址。
        /// </summary>
        public string? QueryIP { get; set; }

        /// <summary>
        /// 表示地理信息是否获取成功。
        /// <c>true</c> 表示成功获取，<c>false</c> 表示失败或未查询到。
        /// </summary>
        public bool Success { get; set; } = false;
    }

}
